#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   generate_print_classnames.py
@Time    :   2025/02/12
@Author  :   HDUZN
@Version :   1.0
@Contact :   hduzn@vip.qq.com
@License :   (C)Copyright 2022-2023
@Desc    :   打印班级学生名单
'''

# here put the import lib
# 获取当前项目目录
# 用os设置ex_file文件路径，用os.path.join()方法，文件名为：全校学生名单202409.xlsx
# 用pandas读取ex_file文件，标题有：年级、班级、班内编号和姓名
# 写两个方法，第一个方法生成年级学生打印名单，第二个方法生成班级学生打印名单
# 生成年级学生打印名单的方法：参数为年级，返回值为年级学生打印名单。生成的表格中包含某干个sheet表，每个sheet表的标题为班级，内容有两列，标题为：班级名和姓名。班级名这一列下面的内容为编内编号。表格名为"output_{年级}年级打印名单.xlsx"。
# 生成班级学生打印名单的方法：参数为班级，返回值为班级学生打印名单。生成的表格中只有一个sheet表，sheet的标题为班级，内容有两列，标题为：班级名和姓名。班级名这一列下面的内容为编内编号。表格名为"output_{班级}打印名单.xlsx"。
# 格式设置是一样的：表格中的字体为Arial，内容全部居中对齐，班级名列宽为6，姓名列宽为8.5，再添加14列空白列，列宽为5。标题行设置填充颜色为浅蓝色，两列有内容的和14列空白列，添加边框线。

import os
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side

# 获取当前项目目录
project_dir = os.path.dirname(os.path.abspath(__file__))

# 用os设置ex_file文件路径，用os.path.join()方法，文件名为：全校学生名单202409.xlsx
ex_file = os.path.join(project_dir, '全校学生名单202409.xlsx')

# 用pandas读取ex_file文件，标题有：年级、班级、班内编号和姓名
df = pd.read_excel(ex_file)

def generate_grade_print_list(grade):
    # 生成年级学生打印名单的方法：参数为年级，返回值为年级学生打印名单。
    grade_df = df[df['年级'] == grade]
    class_groups = grade_df.groupby('班级')

    # 创建一个新的Excel工作簿
    wb = Workbook()

    for class_name, group in class_groups:
        ws = wb.create_sheet(title=str(class_name))
        ws.append([class_name, '姓名'] + [''] * 14)  # 添加14列空白列

        for _, row in group.iterrows():
            ws.append([row['班内编号'], row['姓名']] + [''] * 14)  # 添加14列空白列

        # 设置格式
        for col in ws.columns:
            for cell in col:
                cell.font = Font(name='Arial')
                cell.alignment = Alignment(horizontal='center', vertical='center')
                # 给所有单元格添加边框
                cell.border = Border(left=Side(style='thin'), 
                                    right=Side(style='thin'), 
                                    top=Side(style='thin'), 
                                    bottom=Side(style='thin'))

        ws.column_dimensions['A'].width = 6
        ws.column_dimensions['B'].width = 8.5

        for i in range(3, 17):
            ws.column_dimensions[chr(64 + i)].width = 5

        # 设置标题行背景色
        for cell in ws[1]:
            cell.fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')

    # 删除默认创建的Sheet
    del wb['Sheet']
    
    # 保存文件
    output_file = os.path.join(project_dir, f'output_{grade}年级打印名单.xlsx')
    wb.save(output_file)
    return output_file

def generate_class_print_list(class_name):
    # 生成班级学生打印名单的方法：参数为班级，返回值为班级学生打印名单。
    class_df = df[df['班级'] == class_name]
    
    # 创建一个新的Excel工作簿
    wb = Workbook()
    ws = wb.active
    ws.title = str(class_name)
    ws.append([class_name, '姓名'] + [''] * 14)  # 添加14列空白列
    
    for _, row in class_df.iterrows():
        ws.append([row['班内编号'], row['姓名']] + [''] * 14)  # 添加14列空白列
    
    # 设置格式
    for col in ws.columns:
        for cell in col:
            cell.font = Font(name='Arial')
            cell.alignment = Alignment(horizontal='center', vertical='center')
            cell.border = Border(left=Side(style='thin'), 
                                right=Side(style='thin'), 
                                top=Side(style='thin'), 
                                bottom=Side(style='thin'))

    ws.column_dimensions['A'].width = 6
    ws.column_dimensions['B'].width = 8.5
    
    for i in range(3, 17):
        ws.column_dimensions[chr(64 + i)].width = 5
    
    for cell in ws[1]:
        cell.fill = PatternFill(start_color='ADD8E6', end_color='ADD8E6', fill_type='solid')
    
    # 保存文件
    output_file = os.path.join(project_dir, f'output_{class_name}打印名单.xlsx')
    wb.save(output_file)
    return output_file

# 写个main方法，调用这两个方法
def main():
    # grade_file = generate_grade_print_list(2)
    # print(f'生成的年级学生打印名单文件：{grade_file}')
    
    class_file = generate_class_print_list(201)
    print(f'生成的班级学生打印名单文件：{class_file}')

main()